package com.stack;

import com.linearList.SinglyList;

/**
 * @Author: linKe
 * @Date: 2022/1/1 19:31
 * @FileName: LinkedStack
 * @version: 1.0
 * @Description: 链式栈实现类（基于单链表）
 */
public final class LinkedStack<T> implements Stack<T> {
    /**
     * 使用单链表存储栈元素
     */
    private SinglyList<T> list;

    /**
     * 构造空栈
     */
    public LinkedStack(){
        //构造空单链表
        this.list = new SinglyList<T>();
    }

    /**
     * 判断栈是否空，若空返回true
     * @return  结果
     */
    @Override
    public boolean isEmpty() {
        return this.list.isEmpty();
    }

    /**
     * 元素x入栈，空对象不能入栈
     * @param x 入栈元素
     */
    @Override
    public void push(T x) {
        //单链表头插入元素x     我的默认定义是从1开始 头结点为null没有定义
        this.list.insert(1,x);
    }

    /**
     * 返回栈顶元素（未出栈）；若栈空返回null
     * @return 结果
     */
    @Override
    public T peek() {
        return this.list.get(0);
    }

    /**
     * 出栈，返回栈顶元素；若栈空返回null
     * @return  结果
     */
    @Override
    public T pop() {
        //若栈不空，单链表头删除，返回删除元素
        return this.list.remove(0);
    }

    /**
     * 重写toString
     * 返回栈所有元素的描写字符串，形式为“（，）”
     * @return 结果
     */
    @Override
    public String toString(){
        return this.getClass().getName()+","+this.list.toString();
    }
}
